package supervision.report;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import javax.el.ELContext;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import supervision.library.Beans;
import system.general.Exc;
import system.general.Logged;
import system.general.Message;
import system.general.Persistencia;

/**
 *
 * @author DELL
 */
@ManagedBean(name = "supervision_studentgrafic")
@RequestScoped
public class Grafic_library {

    Logged logged;
    private Persistencia persistencia = new Persistencia();
    private Message msg = new Message();
    private ResultSet rsts;
    private String sql;
    public String detailTable, secondetail;
    public String headerTable;
    public String reportName;
    public int idconsulta;
    int total_pregunta[];
    private List<request.location.Beans> sede_requestList = new ArrayList<>();
    private request.location.Find find_Sede = new request.location.Find();
    private supervision.student.Find student_Find = new supervision.student.Find();

    public Grafic_library() {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        logged = (Logged) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "logged");
        detailTable = "reportes.supervicion_estudiante_grafic_" + String.valueOf(logged.getLoggedId());
        secondetail = "reportes.supervicion_estudiant_gdetail_" + String.valueOf(logged.getLoggedId());
        headerTable = "reportes.supervicion_estudiante_grafic_header_" + String.valueOf(logged.getLoggedId());
        reportName = "supervision_grafic_estudiante.jasper";
    }

    public void grafic() throws Exc, SQLException, NamingException, Exception {
        try {
            Map params = new HashMap();
            system.general.Path path = new system.general.Path();

            //Elimina la tabla
            dropTable();

            //Crea la tabla 
            createTable();

            //inserta los datos
            loadData();

            //lee las propiedades y carga el mapa
            params.put("headerTable", headerTable);
            params.put("secondstable", secondetail);
            params.put("detailTable", getTableName());
            params.put("SUBREPORT_DIR", path.getSupervisionReportPath());
            params.put("logoPath", path.getLogoPathView());
            params.put("reportPath", path.getReportPathView());
            String jasperReport = path.getSupervisionReportPath() + reportName;
            this.persistencia.dbConnect();
            createReport(jasperReport, params, persistencia.getConn());
        } catch (JRException ex) {
            msg.showMsg(namePackage(), "system", ex.getMessage());

        } catch (Exception ex) {
            msg.showMsg(namePackage(), "system", ex.getMessage());
        } finally {
            this.persistencia.dbDisconnect();
        }
    }

    private void dropTable() throws Exc, SQLException, NamingException, Exception {

        sql = "DROP TABLE IF EXISTS " + headerTable + " , " + secondetail + " , " + detailTable;
        persistencia.executeUpdate(sql);

    }

    private void createTable() throws Exc, SQLException, NamingException, Exception {
        /* sql = "CREATE TABLE " + detailTable
         + "( id serial ,"
         + " id_solicitud integer,"
         + "total integer,"
         + "pregunta1 integer,"
         + "pregunta2 integer,"
         + "pregunta3 integer,"
         + "pregunta4 integer,"
         + "pregunta5 integer,"
         + "pregunta6 integer,"
         + "pregunta7 integer,"
         + "pregunta8 integer,"
         + "pregunta9 integer,"
         + "pregunta10 integer,"
         + "pregunta11 integer,"
         + "pregunta12 integer,"
         + "pregunta13 integer,"
         + "pregunta14 integer);";*/

        sql = " CREATE TABLE " + secondetail
                + "( id serial ,"
                + "pregunta integer,"
                + "porcentaje double precision,"
                + "preguntatext text);";


        sql += " CREATE TABLE " + getTableName()
                + "( id serial ,"
                + "pregunta integer,"
                + "preguntatext text);";


        sql += " CREATE TABLE " + headerTable
                + " (etiqueta1 text,"
                + "detalle1 text, "
                + "etiqueta2 text, "
                + "detalle2 text, "
                + "etiqueta3 text, "
                + "detalle3 text, "
                + "etiqueta4 text, "
                + "detalle4 text, "
                + "etiqueta10 text, "
                + "detalle10 text, "
                + "etiqueta6 text, "
                + "detalle6 text, "
                + "etiqueta7 text, "
                + "detalle7 text, "
                + "etiqueta8 text, "
                + "detalle8 text, "
                + "etiqueta9 text, "
                + "detalle9 text, "
                + " etiqueta12 text,"
                + " detalle12 text,"
                + "etiqueta11 text, "
                + "detalle11 text, "
                + "etiqueta13 text, "
                + "detalle13 text, "
                + "etiqueta14 text, "
                + "detalle14 text, "
                + "etiqueta5 text, "
                + "detalle5 text);";

        persistencia.executeUpdate(sql);
    }

    private void loadData() throws Exc, SQLException, NamingException, Exception {
        try {
            int preguntaNumero, numeroSolicitud;
            // alamcenara la cantidad de encuestas llenada 
            int total_encuestas = 0;
            float porcent;
            total_pregunta = new int[15];
            String descripcion_pregunta = "";
            String descripcion_respuesta;
            String universidad_nombre;
            String universidad_sede;
            String carrera;
            Date registrado = new Date();
            boolean checked;
            Map map = new LinkedHashMap();

            map.clear();
            map.put("css.id= " + logged.getMasterId(), " ");
            this.sede_requestList = find_Sede.byMap(map);
            idconsulta = sede_requestList.get(0).getId_sede();
            String select = "SELECT sg.id as solicitud,pg.nombre || ' ' || pg.apellido AS recepcionista, ug.nombre AS universidad_nombre, "
                    + "us.nombre AS universidad_sede, sg.carrera as carrera, sg.recibido, sg.registrado as registrado FROM solicitud_general sg "
                    + "LEFT JOIN solicitud_sede ss ON (sg.id = ss.id_solicitud) "
                    + "LEFT JOIN persona_general pg ON (pg.id = sg.id_recepcionista) "
                    + "LEFT JOIN universidad_facultad uf ON (sg.id_facultad = uf.id) "
                    + "LEFT JOIN universidad_general ug ON (ug.id = uf.id_universidad) "
                    + "LEFT JOIN universidad_sede us ON (us.id_universidad = ug.id) "
                    + "WHERE sg.id =" + idconsulta;


            rsts = persistencia.executeRsts(select);

            rsts.next();

            universidad_nombre = rsts.getString("universidad_nombre");
            universidad_sede = rsts.getString("universidad_sede");
            carrera = rsts.getString("carrera");
            registrado = rsts.getDate("registrado");
            numeroSolicitud = rsts.getInt("solicitud");

            rsts.close();

            Properties mp = leerReportProperties();

            sql = "INSERT INTO " + headerTable + " "
                    + "(etiqueta1, detalle1,"
                    + " etiqueta2, detalle2,"
                    + " etiqueta3, detalle3,"
                    + " etiqueta4, detalle4,"
                    + " etiqueta10, detalle10,"
                    + " etiqueta6, detalle6,"
                    + " etiqueta7, detalle7,"
                    + " etiqueta8, detalle8,"
                    + " etiqueta9, detalle9,"
                    + " etiqueta12, detalle12,"
                    + " etiqueta11, detalle11,"
                    + " etiqueta13, detalle13,"
                    + " etiqueta14, detalle14,"
                    + " etiqueta5, detalle5)"
                    + " VALUES ("
                    + "'" + mp.getProperty("field1") + "','" + numeroSolicitud + "',"
                    + "'" + mp.getProperty("field2") + "','" + universidad_nombre + "',"
                    + "'" + mp.getProperty("field3") + "','" + universidad_sede + "',"
                    + "'" + mp.getProperty("field4") + "','" + registrado + "',"
                    + "'" + mp.getProperty("field10") + "','" + carrera + "',"
                    + "'" + mp.getProperty("field14") + "','',"
                    + "'" + mp.getProperty("field15") + "','',"
                    + "'" + mp.getProperty("field16") + "','',"
                    + "'" + mp.getProperty("field17") + "','',"
                    + "'" + mp.getProperty("field19") + "','',"
                    + "'" + mp.getProperty("field18") + "','',"
                    + "'" + mp.getProperty("field11") + "','',"
                    + "'" + mp.getProperty("field12") + "','',"
                    + "'" + mp.getProperty("title3") + "','')";
            persistencia.executeUpdate(sql);

            mp.clear();
            mp = leerProperties();

            idconsulta = sede_requestList.get(0).getId();
            for (Enumeration idl_pregunta = mp.keys(); idl_pregunta.hasMoreElements();) {
                Object obj = idl_pregunta.nextElement();
                String questionKey = obj.toString();
                if (questionKey.startsWith("pregunta")) {
                    String codigo = questionKey.substring(8);
                    descripcion_pregunta = mp.getProperty(questionKey);
                    preguntaNumero = Integer.parseInt(codigo);
                    map.clear();
                    map.put("id_solicitud = " + logged.getMasterId(), " AND ");
                    map.put("idl_pregunta = " + preguntaNumero, " ");
                    checked = student_Find.byExist(map);

                    descripcion_respuesta = mp.getProperty("respuesta0");
                    if (checked) {
                        descripcion_respuesta = mp.getProperty("respuesta1");
                    }
                    // realaizamos la consulta y contamos la cantidad de preguntas  de acuerdo al el nuemro de la pregunta
                    sql = "select count(idl_pregunta) as total from evaluacion_estudiante "
                            + " where  idl_pregunta=" + preguntaNumero;
                    rsts = persistencia.executeRsts(sql);
                    rsts.next();
                    //Alamacenamos la  cantidad de vecesqeu se lleno la pregunta
                    total_pregunta[preguntaNumero] = rsts.getInt("total");

                    sql = "INSERT INTO " + getTableName() + " "
                            + "(pregunta,preguntatext) values (" + preguntaNumero + ",'" + descripcion_pregunta + "')";
                    persistencia.executeUpdate(sql);



                }
            }
            total_encuestas = this.calcular_Mayor();
            for (int c = 1; c < total_pregunta.length; c++) {
                float respuesta;
                respuesta = (float) (total_pregunta[c] * 100);
                porcent = ((float) respuesta / total_encuestas);

                sql = "INSERT INTO " + secondetail + " "
                        + "( pregunta,porcentaje,preguntatext) values (" + c + "," + porcent + ",'" + descripcion_pregunta + "')";
                persistencia.executeUpdate(sql);

            }

        } catch (JRException ex) {
            msg.showMsg(namePackage(), "system", ex.getMessage());

        } catch (Exception ex) {
            msg.showMsg(namePackage(), "system", ex.getMessage());
        } finally {
        }
    }

    public Properties leerProperties() {
        Properties propiedades = new Properties();
        try {
            propiedades.load(getClass().getResourceAsStream("/supervision/student/label_" + logged.getLoggedIdiom() + ".properties"));
            if (propiedades.isEmpty()) {
                return null;
            }
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
            return propiedades;
        }
    }

    public Properties leerReportProperties() {
        Properties propiedades = new Properties();
        try {
            propiedades.load(getClass().getResourceAsStream("label_" + logged.getLoggedIdiom() + ".properties"));
            if (propiedades.isEmpty()) {
                return null;
            }
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
            return propiedades;
        }
    }

    public int calcular_Mayor() {
        int resultado = total_pregunta[0];
        for (int i = 0; i < total_pregunta.length; i++) {
            if (total_pregunta[i] > resultado) {
                resultado = total_pregunta[i];
            }
        }
        return resultado;
    }

    public void createReport(String archivoJasper, Map params, Connection ds) throws JRException, IOException {
        try {
            JasperPrint jasperPrint = JasperFillManager.fillReport(archivoJasper, params, ds);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
        } catch (Exception ex) {
            msg.showMsg(namePackage(), "system", ex.getMessage());
        }
    }

    public String getTableName() {
        return detailTable;
    }

    private String namePackage() {
        Package pack = this.getClass().getPackage();
        return pack.getName();
    }
}
